package DAO;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;
import java.sql.ResultSet;
import java.sql.Statement;
import java.text.Collator;
import java.util.Locale;

import ConexaoBackupBD.ConexaoBD;
import ConexaoBackupBD.MetodosVerificacaoBD;
import BD.UsuarioBD;

public class UsuarioDAO {
    
    //Conexão com o banco da dados
    ConexaoBD conBD = new ConexaoBD();
    
    //Metodo unique, auto incremento
    MetodosVerificacaoBD metBD = new MetodosVerificacaoBD();
    
    Statement BDUsuario;
    ResultSet rs;

    //Utilizada para comparar strings
    Collator collator = Collator.getInstance (new Locale ("pt", "BR"));    
    
    public int autoIncremento(){
        return metBD.autoIncremento("usuario", "cod_usu");
    }
    
    public boolean inserirUsuario(UsuarioBD usu){     
        try
        {
            Connection con = conBD.conectar();
            
            if(metBD.unique("usuario", "nome_usu", usu.getNome()) ){ // Usuario não Duplicado
                BDUsuario = con.createStatement();
                BDUsuario.execute("INSERT INTO usuario VALUES "
                        + " ('"+usu.getCodigo()+"', '" + usu.getNome() + "', "
                        + " '" + usu.getSenha() + "', '" + usu.getEmail() + "');");
                JOptionPane.showMessageDialog(null,"Cadastro Realizado com Sucesso", 
                        "Cadastro", JOptionPane.INFORMATION_MESSAGE);
            
                con.close();
                return true;
            }
            else{
                JOptionPane.showMessageDialog(null,"Usuario já existe",
                        "Usuario Duplicado no Banco de Dados", JOptionPane.ERROR_MESSAGE);
                con.close();
            }        
        }
        catch (SQLException ex) {
            JOptionPane.showMessageDialog(null,"Não foi possível conectar ao banco", 
            "Erro no banco", JOptionPane.ERROR_MESSAGE);
            return false;
        }       
        return false;
    }
    
    public List<UsuarioBD> filtro(String campo, String valor) {      
        List<UsuarioBD> listaFiltro = new ArrayList<UsuarioBD>(); 
        try { 
            Connection con = conBD.conectar();
            BDUsuario = con.createStatement();
            rs = BDUsuario.executeQuery("SELECT * from usuario where "+campo+" like '" + valor + "%'");
            if (rs != null) { 
                while (rs.next()) { 
                    UsuarioBD us = new UsuarioBD();
                    us.setCodigo(rs.getInt("cod_usu"));
                    us.setNome(rs.getString("nome_usu"));
                    //us.setSenha(rs.getString("senha_usu"));
                    us.setEmail(rs.getString("email_usu")); 
                    listaFiltro.add(us); 
                }
                return listaFiltro; 
          }else { 
                return null; 
          } 
        } catch (SQLException e) { 
            return null; 
        } 
    }
     
    public boolean verificaAutenticidade(int codigo, String senhaDigitada){
        try { 
            Connection con = conBD.conectar();
            BDUsuario = con.createStatement();
            rs = BDUsuario.executeQuery("SELECT * from usuario where cod_usu = '" + codigo + "%'");
            rs.first();
            if(rs.getString("senha_usu").equals(senhaDigitada)){
                return true;
            }
            else{
                return false; 
            }                      
        } catch (SQLException e) { 
            return false; 
        } 
    }

    public boolean alterarUsuario(UsuarioBD us){
        String sql = "update usuario set nome_usu = ?,senha_usu= ?, email_usu = ?";
        sql += " where cod_usu = ?";

        try {
            // obtem conexão 
            Connection con = conBD.conectar();
            BDUsuario = con.createStatement();

            //Obtem o nome do usuario e compara com o  
            //que foi ENVIADO para alteração (us.get = o que o usuario digitou)
            // SELECT ira obter o atual para aquele codigo
            rs = BDUsuario.executeQuery("SELECT nome_usu from usuario where cod_usu = '"+us.getCodigo()+"'");
            rs.first();
            String capturaNome= rs.getString("nome_usu");

            //seta o nível de diferença quando forem comparadas
            collator.setStrength(Collator.PRIMARY);

            if(metBD.unique("usuario", "nome_usu", us.getNome()) || collator.compare(capturaNome, us.getNome()) == 0) // Deixa Cadastrar
            {
                PreparedStatement ps = con.prepareStatement(sql);
                ps.setString(1, us.getNome());
                ps.setString(2, us.getSenha());
                ps.setString(3, us.getEmail());
                ps.setString(4, (String.valueOf(us.getCodigo())));
                if (ps.executeUpdate() > 0) {
                    JOptionPane.showMessageDialog(null,"Alteração realizada com sucesso",
                            "Alterar", JOptionPane.INFORMATION_MESSAGE);
                    con.close();
                return true;
                } else {
                    JOptionPane.showMessageDialog(null,"Não foi possivel realizar a alteração",
                            "Erro em alterar", JOptionPane.INFORMATION_MESSAGE);
                    con.close();
                return false;
                }     
            }
            else{               
                JOptionPane.showMessageDialog(null,"Usuario já existe", 
                        "Usuario duplicado", JOptionPane.INFORMATION_MESSAGE);
                return false;
            }
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null,"Não foi possível conectar ao banco", 
                    "Erro no banco", JOptionPane.ERROR_MESSAGE);
            return false;
        }

    }
    
    public boolean excluirUsuario(int codigoEnviado){
        String sql = "delete from usuario where cod_usu = ?";
        try {
            Connection con = conBD.conectar();
            PreparedStatement ps = con.prepareStatement(sql);
            ps.setString(1, (String.valueOf(codigoEnviado)));
            if (ps.executeUpdate() > 0) {
                return true;
            } else {
                return false;
            }
        } catch (SQLException e) {
             JOptionPane.showMessageDialog(null,"Não foi possível conectar ao banco", 
             "Erro no banco", JOptionPane.ERROR_MESSAGE);
             return false;
        }
   }    
    
    public boolean logar(UsuarioBD us){ // Campos Unicos no Banco
        try
        {
            Connection con = conBD.conectar();
            BDUsuario = con.createStatement();
            rs = BDUsuario.executeQuery("select count(cod_usu) "
                    + " from usuario where nome_usu = '"+us.getNome()+"' "
                    + " and senha_usu = '"+us.getSenha()+"' ");
            rs.last();

            if(rs.getInt(1) == 1){           
                con.close();
                return true; //Usuario e senha ok, pode logar
            }
            else
            { 
                con.close();  
                return false; //Usuario ou senha inválido
            } 
        }    
        catch (SQLException ex) {
                JOptionPane.showMessageDialog(null,ex.getMessage(), 
            "Erro no banco", JOptionPane.ERROR_MESSAGE);
            return false;
        }
    }
}
